package com.itheima.myreflect2.Student.threaddemo1;

/**
 * @program: Myset
 * @description:
 * @author: xuejingjing
 * @create: 2021-06-16 23:36
 **/

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 1，为什么要重写run方法？因为run()方法是用来封装线程执行的代码。
 *
 * 2，run方法和strat()方法的区别？
 * run():封装线程执行的代码，直接调用，相当于普通方法的调用，并没有开启线程、
 * start():启动线程，然后由jvm调用此线程的run()方法。
 *
 */
public class Demo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {

        //线程开启之后，需要执行里面的call方法
        MyCallable mc = new MyCallable();
        //这个泛型 要和Callable返回值的类型一致。
        //可以获取线程执行完毕之后的结果，也可以作为参数传递给thread对象
        FutureTask<String> ft = new FutureTask<>(mc);
        //创建线程对象
        Thread t1 = new Thread(ft);
        //开启线程
        t1.start();
        //获取线程执行完之后的结果。
        String s = ft.get();
        System.out.println(s);

        //mthod1();
        //Method2();
    }

    private static void mthod1() {
        //创建一个线程对象
        MyThread mt = new MyThread();
        //创建一个线程对象
        MyThread mq = new MyThread();
        //开启一条线程
        mt.start();
        //开启第二条线程
        mq.start();
    }

    private static void Method2() {
        //创建一个参数的对象
        MyRunnable mr = new MyRunnable();
        //创建一个线程对象，并把参数传递给这个线程，
        //在线程启动之后，执行的就是参数里面的run方法
        //Thread类才是线程类，MyRunnable只是参数。
        Thread t1 = new Thread(mr);
        //开启线程
        t1.start();

        MyRunnable mr1 = new MyRunnable();
        Thread t2 = new Thread(mr1);
        t2.start();
    }
}


